相同类型的扫描仪方法在一个地方工作,但在另一个地方不起作用...我使用eclipse作为我的代码编辑器,如果它改变了任何答案。所有变量都在别处声明,如果不在这里的话。
如果有人知道如何解决这个问题,我将永远感谢您:)
这个是有效的:
private String questionPicker(String str)
{
question = (int)(Math.random()*42);
System.out.println(question);
fileChoose = str.toUpperCase();
String returnee;
Scanner is = null;
try
{
is = new Scanner(new FileInputStream("triviaQ"+fileChoose+".txt"));
}
catch(FileNotFoundException z)
{
System.out.println("Error 004: File retrieve failed.");
}
skipLines(is, question);
returnee = is.nextLine();
is.close();
return returnee;
}这个不起作用:
public String getAnswer()
{
String returnee;
Scanner ls = null;
try
{
ls = new Scanner(new FileInputStream("triviaA"+fileChoose+".txt"));
}
catch(FileNotFoundException z)
{
System.out.println("Error 004: File retrieve failed.");
}
skipLines(ls, question);
returnee = ls.nextLine();
ls.close();
return returnee;
}错误消息:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "java.util.Scanner.nextLine()" because "ls" is null
at jepp.JepQA.getAnswer(JepQA.java:60)
at jepp.JepGui.actionPerformed(JepGui.java:268)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6617)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6382)
at java.desktop/java.awt.Container.processEvent(Container.java:2264)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4993)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2322)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4934)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4563)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4504)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2308)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)发布于 2021-11-10 20:23:30
仅仅捕获异常是不够的;您还必须相应地更改代码路径。
您的代码具有以下形式:
Scanner ls = null;
try {
ls = new Scanner(...);
} catch(FileNotFoundException z) {
// print error message
}
// do something with ls如果发生异常,则在打印错误消息后继续执行,并且在使用ls执行do something代码时,ls仍然为null,这就是您获得NullPointerException的原因。
要修复此问题,请在出现异常时退出该方法:
Scanner ls = null;
try {
ls = new Scanner(...);
} catch(FileNotFoundException z) {
// print error message
return;
}
// do something with ls或者在try中移动使用ls的代码
try {
Scanner ls = new Scanner(...);
// do something with ls
} catch(FileNotFoundException z) {
// print error message
}另请注意,在上一个版本中,我们不仅保存了一行代码(赋值和声明为一行),而且ls的作用域仅限于try块;限制作用域是很好的编码实践。
https://stackoverflow.com/questions/69919381
复制相似问题