首页 > 解决方案 > 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)

标签: javajava.util.scannerfileinputstream

解决方案


仅仅捕获异常是不够的;您还必须相应地更改代码路径。

您的代码具有以下形式:

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块;限制范围是良好的编码习惯。


推荐阅读