Pętla do while

0

Witam.Napisałem prostą pętle ,ale z jakimś błedem i nie moge tego skompilowac.Patrze na to już z godzine i nie wiem o co chodzi.
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader wej = new BufferedReader(

new InputStreamReader (System.in));

do{

String s;

int nrmiesiaca;

System.out.println("Podaj nr miesiąca:");

s = wej.readLine();

nrmiesiaca = Integer.parseInt(s);

}

while ( (nrmiesiaca < 1) || (nrmiesiaca > 12) );</delphi>

0
  1. dodaj } } na koniec kodu
  2. przenies int nrmiesiaca; przed do {....
0

Gdybyś miał jakoś konsekwentnie sformatowany kod, jak na przykład poniżej

import java.io.*;
class Main
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader wej =
			new BufferedReader(new InputStreamReader(System.in));
		do
		{
			String s;
			int nrmiesiaca;
			System.out.println("Podaj nr miesiąca:");
			s = wej.readLine();
			nrmiesiaca = Integer.parseInt(s);
		}
		while((nrmiesiaca < 1) || (nrmiesiaca > 12));
	}
}

...to dość łatwo znalazłbyś błąd ponieważ zasięg zmiennej nie może wyjść poza blok - a tam ją właśnie używałeś. W ten sposób deklaracja zmiennej byłaby widoczna jako "bardziej wcięta" niż w błędnych miejscach jej użycia.

Gdybyś używał jeszcze jakiegoś porządnego IDE, typu netbeans lub eclipse, to zamiast tracić godzinę na męczeniu oczu zobaczyłbyś i poprawiłbyś błąd w sekundy.
U mnie nrmiesiąca został podkreślony na szaro mówiąc, że zmienna ta nie jest nigdy używana, a "while((nrmiesiaca < 1) || (nrmiesiaca > 12));" na czerwono, pokazując, że nrmiesiaca nie została znaleziona.

Tak na marginesie jest w tym kodzie jeszcze inny błąd. Przecież Integer.parseInt(s) wcale nie musi się udać. Ba, nawet wej.readLine() nie musi być udane. A tym samym zmiennej w ogóle nie musi być nadana jakakolwiek wartość. Wtedy wyskoczy wyjątek wykonania, a całe Twoje zabezpieczenie stanie się i tak bezwartościowe.
Poniżej masz pętlę, która jest odporna, i na błąd wejścia i na błędny format tego wejścia. W razie jakiegokolwiek błędu wraca na początek pętli. Równie dobrze zamiast continue; można użyć nadania zmiennej nrmiesiąca wartości poza zakresem 1..12. Warto też pamiętać, żeby dla własnej oszczędności czasu wpatrywania się w ekran nadawać zmiennym początkowe wartości - o ile to możliwe zawsze wartość nieprawidłową, która zostanie szybko wykryta.

import java.io.*;
class Main
{
	public static void main(String[] args)
	{
		BufferedReader wej =
			new BufferedReader(new InputStreamReader(System.in));
		int nrmiesiaca = 0;
		do
		{
			System.out.println("Podaj nr miesiąca:");
			try { nrmiesiaca = Integer.parseInt(wej.readLine()); }
			//Dwa wyjątki na raz: IOException i NumberFormatException
			catch(Exception ex) { continue; }
		}
		while((nrmiesiaca < 1) || (nrmiesiaca > 12));
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1