如果我关闭第一个扫描程序并创建一个新的扫描程序,Scanner.nextLine()会抛出异常

时间:2014-06-01 18:42:32

标签: java java.util.scanner user-input

我想实现一个programm,它从用户输入中读取两个字符串。

        try 
    {
        System.out.println( "please enter a valid URL ( i.e. http://www.uibk.ac.at )" );
        Scanner inputScanner = new Scanner( System.in );
        String urlString = inputScanner.next(); 
        asciiTable = new int[NUM_ASCII_CHAR];
        URL url = new URL( urlString );
        URLConnection connection = url.openConnection();
        connection.connect();
        InputStreamReader in = new InputStreamReader( url.openStream() );
        countCharactersfromFile( in );
        printAsciiTable( asciiTable );
        printNumberOfChars( asciiTable );
        inputScanner.close();
        in.close();
    }
    // it has not the form of an URL
    catch ( MalformedURLException e ) 
    {
        e.printStackTrace();
    }
    // If the site cannot be connected
    catch( UnknownHostException e )
    {
        e.printStackTrace();
    }
    // some IO-Error occurs
    catch ( IOException e ) 
    {
        e.printStackTrace();
    }
    // if the ASCII array is empty
    catch( EmptyListException e )
    {
        e.printStackTrace();
    }
    catch( IllegalArgumentException e )
    {
        e.printStackTrace();
    }
    catch ( Exception e ) 
    {
        e.printStackTrace();
    }
    try
    {
        System.out.println( "Please enter the name of a file " );
        asciiTable = new int[NUM_ASCII_CHAR];
        Scanner scanner = new Scanner( System.in );
        String fileString = scanner.next();
        FileInputStream fileStream = new FileInputStream( fileString );
        InputStreamReader in = new InputStreamReader( fileStream );
        countCharactersfromFile( in );
        printAsciiTable( asciiTable );
        printNumberOfChars( asciiTable );
        scanner.close();        
    }
    catch ( IOException e ) 
    {
        e.printStackTrace();
    }
    catch( EmptyListException e )
    {
        e.printStackTrace();
    }
    catch( IllegalArgumentException e )
    {
        e.printStackTrace();
    }
    catch ( Exception e ) 
    {
        e.printStackTrace();
    }

起初我想告诉你我知道这个问题。我应该只在我的程序中使用1个扫描仪。但是如果在我的程序中只使用一个 try block ,如果抛出异常,则不允许执行任务的第二部分。 我有一个解决方案,但我不知道它是否是一个好的。

try
{
    Scanner inputScanner = new Scanner( System.in );
    try
    {
        //the URL code, use inputScanner here
    }
    catch()
    {

    }
    try
    {
        // The file code, use inputscanner here
    }
    catch()
    {

    }
    inputscanner.close();
}
catch()

上面显示的是一个好的解决方案吗?或者你有一些更好的解决方案来解决我的问题。

由于 帕特里克

1 个答案:

答案 0 :(得分:2)

要确保始终关闭Scanner,请将使用它的所有代码包装到try块中,然后在finally块中将其关闭:

Scanner inputScanner = new Scanner(System.in);
try {
    try {
        // 1st operation
    } catch (Exception e) {
        System.err.println("1st operation failed");
    }
    try {
        // 2nd operation
    } catch (Exception e) {
        System.err.println("2nd operation failed");
    }
} finally {
    inputScanner.close();
}

或者使用try-with-resource,它也会这样做:

try (Scanner inputScanner = new Scanner(System.in)) {
    ...
}

最好不要关闭inputScanner。您将无法从标准输入中读取任何其他内容。扫描程序不会消耗任何额外的系统资源,因此您可以让垃圾收集器担心它。

附加提示:如果您没有对它们做任何有用的事情,请不要捕获异常。让它们传播。您甚至可以声明main方法抛出Exception