java - Java Scanner 没有在一个 string() 中初始化,即使它在另一个中初始化
问题描述
相同类型的扫描仪方法在一个地方工作,但在另一个地方没有工作......如果改变任何答案,我将使用 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)
解决方案
仅仅捕获异常是不够的;您还必须相应地更改代码路径。
您的代码具有以下形式:
Scanner ls = null;
try {
ls = new Scanner(...);
} catch(FileNotFoundException z) {
// print error message
}
// do something with ls
如果发生异常,则在打印错误消息后继续执行,并且在执行ls 代码执行某些操作ls
时仍将为空,这就是您获得.NullPointerException
要修复,请在异常时退出方法:
Scanner ls = null;
try {
ls = new Scanner(...);
} catch(FileNotFoundException z) {
// print error message
return;
}
// do something with ls
或者移动使用的ls
代码try
:
try {
Scanner ls = new Scanner(...);
// do something with ls
} catch(FileNotFoundException z) {
// print error message
}
还要注意上一个版本,我们不仅节省了一行代码(赋值和声明为一行),而且范围ls
仅限于try
块;限制范围是良好的编码习惯。
推荐阅读
- spring-boot - 如何以编程方式授权 OpenId Connect 保护的 REST-API?
- python - 无法在 python Windows 中导入 onnxruntime
- spring-boot - 如何使用 Spring Boot JPA 查询方法关键字从 MongoDB 中过滤空字符串
- ios - SocketException(SocketException:主机查找失败:'test'(操作系统错误:提供节点名或服务名,或未知,errno = 8))
- unity3d - 我不明白 RaycastCommand
- ssas - 计算dax中两个日期之间的月末
- reactjs - 重置选项
- python - Django Login Required Middleware 不重定向
- php - 将数组传递给 CURL - 读取 CSV 文件
- python - 刮错表