2012-05-18 28 views
5

Tôi muốn tạo hộp thoại nhập khi bản ghi mới được tạo và lưu đầu vào của người dùng dưới dạng input vào tệp.Lỗi khi hủy showInputDialog

Đây là mã:

String input = JOptionPane.showInputDialog(null, "Enter name : ", "New Record!", 1);    //This to let user input name 
    try 
    { 
     JOptionPane.showMessageDialog(null, "Thanks for playing.", "Thanks", 1);   //Show this dialog after user input 
     HighestScoreFile.HighestScoreFile(input, hours, minutes, seconds, click);     //Store the data into a file, the `method` is in another class. 
    } 
    catch(IOException ex){} 

Khi không có đầu vào người dùng hoặc bất kỳ đầu vào, các OK nút làm việc tốt, nhưng nếu tôi nhấp vào nút cancel, nó sẽ trả về các lỗi này:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at HighestScoreFile.HighestScoreFile(HighestScoreFile.java:22) 
    at MemoryGame$ButtonListener.actionPerformed(MemoryGame.java:329) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:680) 
    at java.awt.EventQueue$4.run(EventQueue.java:678) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

Tôi có thể giải quyết nó bằng cách nào?

Trả lời

9
String input = .... 
if (input!=null) { ... 
+0

Cảm ơn. Nó hoạt động tốt. Xin lỗi một lần nữa cho câu hỏi nhỏ của tôi. – Chin

+1

Nó có thể được sử dụng một số đề cập đến rằng không phải tất cả 'JOptionPane.showInputDialog (...)' phương pháp mô tả những gì được trả lại khi đóng hộp thoại nếu nút Cancel được nhấp. Chỉ có phương thức có số tham số lớn nhất yêu cầu trả về 'null' nếu Cancel được nhấp. – Timmos

+0

@Timmos Điểm tốt. Các tài liệu Java có thể là một chút ngớ ngẩn ở lần, và 'giả định' kiến ​​thức mà không rõ ràng cho người dùng (chúng tôi). Tôi gần như có thể nhìn thấy các lập trình viên khi họ đã có mã nguồn mở và được (buộc phải) viết bình luận mã. Đó là 'rõ ràng' đối với họ hơn mỗi phiên bản ngắn hơn, được gọi là phiên bản toán hạng nhiều hơn với 'null' hoặc mặc định chuẩn - vì vậy nó không bao giờ * xảy ra * để họ đề cập đến trong tài liệu .. Tôi khá chắc chắn chúng ta có thể giả định rằng, nhưng nó sẽ là tốt đẹp để thấy rằng một cách rõ ràng tài liệu. Hoặc ít nhất là '@see 'phiên bản này sử dụng để biết thêm chi tiết ..''. –

6

Nếu người dùng nhấp vào "hủy", input sẽ không có giá trị.

Bạn chỉ nên nhập khối try nếu người dùng nhấp vào "ok" hoặc bạn nên thêm if để kiểm tra xem input có null không trước khi cố gắng sử dụng!

Bây giờ, bạn thực sự có thể vô hiệu hóa các nút hủy với

JOptionPane.showInputDialog(null, "Enter name : ", "New Record!", JOptionPane.OK_OPTION); 

hoặc kiểm tra nếu người dùng nhấp vào hủy với

if (input == null){ 
    // Do something 
} else { 
    try { 
    JOptionPane.showMessageDialog(null, "Thanks for playing.", "Thanks", 1); 
    HighestScoreFile.HighestScoreFile(input, hours, minutes, seconds, click); 
    } catch(IOException ex){} 
} 
+0

Cảm ơn lời giải thích. – Chin

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