2014-07-14 23 views
-1

我有一個主要功能,使用掃描器從控制檯讀取整數。 在這個主函數內部,我們可以訪問另一個函數,它也使用掃描器來讀取一個整數。所以,這個程序多次在這兩個函數之間搖擺。但是,Java.util.scanner會引發異常。有什麼辦法可以解決這個問題嗎?如何在java中創建多個掃描器元素

import java.util.Scanner; 

public class dummy { 

    public static void main(String[] args) { 

     int buy; 

     Scanner sc = new Scanner(System.in); 
     buy = sc.nextInt(); 
     user = dummy2(); 
     sc.close(); 
    } 

    static boolean dummy2(){ 

     Scanner sc1 = new Scanner(System.in); 
     sc1.close(); 
    } 
} 
+3

考慮充實你的問題,提供細節並展示相關的代碼。 –

+1

好的,我會用最簡單的方式更新我的問題,例如 – user3683555

+0

將你的掃描儀聲明爲main和你的其他函數之外的類變量。 – csmckelvey

回答

2

首先,它會使這個問題容易得多,如果你給的更多信息,異常和它的消息,也許源代碼,如回答。

如果異常是NoSuchElementException,直接的問題是該函數正在關閉掃描器。當掃描儀關閉時,它也會關閉底層的ImputStream。這使得該輸入上的所有其他掃描器都無效。

如果異常是InputMismatchException,那麼輸入不是int。

如果異常是IllegalStateException,那麼掃描器已關閉,可能發生的是該函數和主要方法正在使用掃描器,並關閉它。

但是,您不應該在功能中進行用戶輸入。這限制了將來的使用,例如,如果您想稍後添加GUI或根據用戶未獲得的數字進行相同的計算,則需要重新編寫該函數。函數應該將int作爲參數,主要方法應該從用戶那裏獲取。只有與用戶輸入直接相關的主要方法和其他方法(如掃描儀的方法)才能讀取用戶輸入。

+0

這是一個非常有用的答案。我得到Nosuch元素異常,因爲問題是功能正在關閉掃描儀。當掃描儀關閉時,它也會關閉底層的ImputStream。這使得該輸入上的所有其他掃描器都無效。是的,你是對的。但是,我需要找到一種方法來從2個不同的功能獲得來自用戶的2個輸入。 – user3683555

+0

但是,您不應該在功能中使用用戶輸入。這限制了將來的使用,例如,如果您想稍後添加GUI或根據用戶未獲得的數字進行相同的計算,則需要重新編寫該函數。函數應該將int作爲參數,主要方法應該從用戶那裏獲取。只有與用戶輸入直接相關的主要方法和其他方法(如掃描儀的方法)才能讀取用戶輸入--->總結它。我會告訴你它是否工作 – user3683555

1

使用相同的掃描儀對象。

import java.util.Scanner; 

public class dummy { 

private static final Scanner sc = new Scanner(System.in); 

public static void main(String[] args) { 

    int buy; 

    buy = sc.nextInt(); 
    user = dummy2(); 
//Do more stuff with the same scanner 
//close it when done 


} 

static boolean dummy2(){ 
//Scan stuff 
int nbr = sc.nextInt(); 

} 
+0

如果我使用這個,它說sc不能解決 – user3683555

+0

@ user3683555:可能是因爲你聲明它在主方法內而不是在方法之前。你需要聲明它是靜態的並且在類中。 –

+0

你在'main'中隱藏'sc'。此外,由於我們總是從'System.in'中取出,爲什麼不只是聲明並實例化它作爲一個字段呢? – Makoto

-1

我建議這樣的事情:

import java.util.Scanner; 

public class dummy { 
    Scanner sc = new Scanner(System.in); 

    public static void main(String[] args) { 

     int buy; 

     buy = sc.nextInt(); 
     user = dummy2(); 
     sc.close(); 

    } 

    static boolean dummy2(){ 
     //lets scan a string. 
     sc.nextLine(); 
    } 
} 

可重用的對象!這不是很好嗎?

+1

爲什麼你關閉同一臺掃描儀兩次? – Jakkra

+0

我剛剛在他的示例類中實現了掃描器,不再修改代碼。不過謝謝。 –