2012-10-07 37 views
5

Tôi đã nhìn chằm chằm vào điều này hàng giờ và không thể nghĩ ra giải pháp; Tôi thường xử lý xác nhận loại này với regex nhưng tôi đang cố gắng sử dụng giải pháp tích hợp cho thay đổi (rõ ràng là tôi không thực hiện việc này thường xuyên):Java try/catch - hoặc "return không tìm thấy" hoặc "biến không được khởi tạo"?

private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
    } 
} 

Lỗi này là "trả lại "không được tìm thấy bởi trình biên dịch vì vậy tôi nhận được một lỗi biên dịch. Nếu tôi đặt "trả về" bên ngoài của try/catch tôi cần phải khai báo/khởi tạo "input2" mà đánh bại mục đích của hoạt động. Bất kỳ hỗ trợ nào được đánh giá cao ...

+1

Bạn bắt ngoại lệ, in ra một tin nhắn, nhưng sau đó phương pháp vẫn tiếp tục từ khối' catch'. Trình biên dịch phàn nàn về thực tế là bạn không quay trở lại nếu khối catch được nhấn (không phải tất cả – birryree

Trả lời

0

Bạn cần phải trả lại hoặc ném một cái gì đó từ (hoặc sau khi đánh bắt). Đánh giá bởi đầu ra của bạn cho người dùng, có vẻ như bạn chỉ muốn làm điều tương tự một lần nữa. Chỉ cần gọi lại phương thức và trả về kết quả.

private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
     return promptUserDecimal(); 
    } 
} 
+0

Sử dụng đệ quy cho "thử lại" là kỳ lạ; nó sẽ tạo thêm nhiều cuộc gọi đang chờ xử lý trên ngăn xếp mỗi lần. Mặc dù người dùng không có khả năng nhập vào đủ thời gian đủ để gây tràn ngăn xếp, một vòng lặp sẽ có ý nghĩa hơn. – Wyzard

1

Hãy để phương pháp của bạn ném ngoại lệ hoặc trả lại nan.

3

Ném ngoại lệ trong phần catch. Bất cứ nơi nào bạn gọi phương thức promptUserDecimal, bắt bất kỳ ngoại lệ và in thông điệp đó:

public static void main(String[] args) { 

    double d = 0.0; 
    while (double == 0) { 
     try { 
      d = promptUserDecimal(); 
     } catch (NumberFormatException e) { 
      //log the message... 
      d = 0.0; 
     } 
    } 
} 

private static double promptUserDecimal() throws NumberFormatException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    return Double.parseDouble(scan.nextLine()); 
} 

Đây sẽ là một cách tiếp cận tốt hơn bởi vì bạn để promptUserDecimal quan tâm chỉ về xử lý đọc một giá trị gấp đôi. Bạn phải cố gắng phân biệt từng lớp và phương pháp cho mục đích cụ thể mà nó được thiết kế cho.

+0

+1 nhưng nếu bạn định ném 'NumberFormatException', thì bạn không cần phải nắm bắt nó, đừng bắt nó ngay từ đầu, hãy để' parseDouble' ném ngoại lệ. –

+0

@ user1598390 –

3

Bạn cần một cái gì đó như:

double input2; 
try{ 
    //read input2 
}catch(...){ 
    //... log AND assign a value to input2 in case of invalid input 
} 
return input2; 
+0

Bạn có thể gán giá trị lỗi mặc định khi khai báo biến số –

0

Bạn có thể ném một ngoại lệ trong khối catch của bạn. tức là,

private static double promptUserDecimal() throws OopsException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
     throw new OopsException(); 
    } 
} 

Sau đó, mỗi khi chúng cung cấp đầu vào không hợp lệ, bạn có thể nắm bắt và xử lý nó khi bạn gọi phương thức.

0
private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    double input2 = 0.0; // <-- explicit initialization 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
    } 
    return input2; 
} 
3

Nếu bạn muốn người dùng "hãy thử lại", có vẻ như bạn cần một vòng lặp:

private static double promptUserDecimal(){ 
    final Scanner scan = new Scanner(System.in); 

    // Ask for input until we get something valid 
    while (true) { // Terminated by return within 
     System.out.println("Enter a decimal"); 
     try { 
      return Double.parseDouble(scan.nextLine()); 
     } catch(NumberFormatException e){ 
      System.out.println("Sorry, you provided an invalid option, please try again."); 
      // No return, so the loop will run again 
     } 
    } 
} 
+1

Tôi có một câu hỏi: Đoạn mã này biên dịch? –

+0

@PaulVargas, nó biên dịch cho tôi. Bạn có gặp lỗi trong số đó không? – Wyzard

+0

OP: I như giải pháp này cho tập lệnh không giám sát. – user1612272

0

Một vài trong số các giải pháp được liệt kê sẽ giải quyết vấn đề biên dịch, nhưng bước đầu tiên là để lùi lại một bước và yêu cầu "những gì tôi muốn làm trong trường hợp một NumberFormatException xảy ra?"

Một tùy chọn là truyền bá ngoại lệ bằng cách làm lại NumberFormatException hoặc gói nó trong một RuntimeException để nó không được kiểm soát. Điều này có nghĩa là mã gọi sẽ phải xử lý nó, hoặc người dùng sẽ được trình bày với một stacktrace. Nếu bạn đi tuyến đường này, bạn thậm chí không cần một thử bắt trong phương pháp của bạn. Bạn chỉ có thể khai báo "ném NumberFormatException" vào chữ ký phương thức và để nó xử lý luồng.

Một tùy chọn khác là trả về giá trị rỗng, bằng cách sử dụng "return null" làm câu lệnh cuối cùng trong khối catch của bạn hoặc trả về null như câu lệnh cuối cùng trong phương thức. Đây là một lựa chọn khủng khiếp vì mã gọi và/hoặc người dùng cuối sẽ không nhận được thông tin họ cần, rằng "một số không được nhập là đầu vào".

Tôi sẽ sử dụng tùy chọn một và xử lý ngoại lệ bằng cách thông báo cho người dùng rằng scan.nextline + "không được nhận dạng là giá trị gấp đôi hợp lệ."

Các vấn đề liên quan