Java uses unchecked or unsafe operations

0

Witam!
Mam problem - podczas kompilowania pliku .java wyświetla mi się następujący błąd:

Note: PortalGraMax.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Wyczytałem, że ten błąd pojawia się gdy nie ma zgodności typów w kolekcjach. Niestety nie mogę dojść gdzie jest błąd.
Kod klas:

PortalGraMax:

import java.util.*;

public class PortalGraMax {
	
	private PomocnikGry pomocnik = new PomocnikGry();
	private ArrayList<Portal> listaPortali = new ArrayList<Portal>();
	private int iloscRuchow = 0;
	
	private void przygotujGre() {
		
		Portal pierwszy = new Portal();
		pierwszy.setNazwa("onet.pl");
		Portal drugi = new Portal();
		drugi.setNazwa("wp.com");
		Portal trzeci = new Portal();
		trzeci.setNazwa("Go2.com");
		
		listaPortali.add(pierwszy);
		listaPortali.add(drugi);
		listaPortali.add(trzeci);
		
		System.out.println("Twoim celem jest zatopienie trzech portali");
		System.out.println("onet.pl, wp.com, Go2.com");
		System.out.println("Postaraj sie je zatopic w jak najmniejszej ilosci ruchow.");
		
		for(Portal rozmieszczanyPortal : listaPortali) {
			
			ArrayList<String> nowePolozenie = pomocnik.rozmiescPortal(3);
			rozmieszczanyPortal.setPolaPolozenia(nowePolozenie);
		}
	}
	
	private void rozpocznijGre() {
		
		while(!listaPortali.isEmpty()) {
			
			String ruchGracza = pomocnik.pobierzDaneWejsciowe("Podaj pole:");
			sprawdzRuchGracza(ruchGracza);
		}
		zakonczGre();
	}
	
	private void sprawdzRuchGracza(String ruch) {
		
		iloscRuchow++;
		String wynik = "pudlo";
		
		for(Portal portalDoSprawdzenia : listaPortali) {
			
			wynik = portalDoSprawdzenia.sprawdz(ruch);
			if(wynik.equals("trafiony")) {
				
				break;
			}
			if(wynik.equals("zatopiony")) {
				
				listaPortali.remove(portalDoSprawdzenia);
				break;
			}
		}
		System.out.println(wynik);
	}
	
	private void zakonczGre() {
		
		System.out.println("Wszystkie portale zostaly zatopione! Teraz Twoje informacje nie maja znaczenia.");
		if(iloscRuchow <= 18) {
			
			System.out.println("Wykonales jedynie " + iloscRuchow + " ruchow.");
			System.out.println("Wydostales sie, zanim Twoje informacje zatonely.");
		} else {
			
			System.out.println("Ale sie grzebales! Wykonales az " + iloscRuchow + " ruchow.");
			System.out.println("Teraz rybki plywaja pomiedzy Twoimi informacjami.");
		}
	}
	
	public static void main(String[] args) {
		
		PortalGraMax gra = new PortalGraMax();
		gra.przygotujGre();
		gra.rozpocznijGre();		
	}
	
	
}

Portal:

import java.util.*;

class Portal {
	
	private ArrayList<String> polaPolozenia;
	private String nazwa;
	
	public void setPolaPolozenia(ArrayList<String> ppol) {
		
		polaPolozenia = ppol;
	}
	
	public void setNazwa(String nzwPortalu) {
		
		nazwa = nzwPortalu;
	}
	
	public String sprawdz(String ruch) {
		
		String wynik = "pudlo";
		int indeks = polaPolozenia.indexOf(ruch);
		
		if(indeks >= 0) {
			
			polaPolozenia.remove(indeks);
			
			if(polaPolozenia.isEmpty()) {
				
				wynik = "zatopiony";
				System.out.println("Auc! Zatopiles portal " + nazwa + " : ( ");
			} else {
				
				wynik = "trafiony";
			}
		}
		return wynik;
	}
}

PomocnikGry:

import java.io.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.*;
import java.io.Console;

public class PomocnikGry {
	
	private static final String alfabet = "abcdefg";
	private int dlugoscPlanszy = 7;
	private int wielkoscPlanszy = 49;
	private int[] plansza = new int[wielkoscPlanszy];
	private int iloscPortali = 0;
	
	public String pobierzDaneWejsciowe(String komunikat) {
		
		String daneWejsciowe = null;
		System.out.print(komunikat + " ");
		
		try {
			
			InputStreamReader read = new InputStreamReader(System.in);
			BufferedReader is = new BufferedReader(read); //new InputStreamReader(System.in));
			daneWejsciowe = is.readLine();
			
			if(daneWejsciowe.length() == 0) return null;
		} catch (IOException e) {
			
			System.out.println("IOException: " + e);
		}
		return daneWejsciowe.toLowerCase();
	}
	
	public ArrayList rozmiescPortal(int wielkoscPortalu) {
		
		ArrayList<String> zajetePola = new ArrayList<String>();
		String[] wspolrzedneLnc = new String [wielkoscPortalu];
		String pomoc = null;
		int[] wspolrzedne = new int[wielkoscPortalu];
		int prob = 0;
		boolean powodzenie = false;
		int polozenie = 0;
		
		iloscPortali++;
		int inkr = 1;
		
		if((iloscPortali % 2) == 1) {
			
			inkr = dlugoscPlanszy;
		}
		
		while(!powodzenie & prob++ < 200) {
			
			polozenie = (int) (Math.random() * wielkoscPlanszy);
			int x = 0;
			powodzenie = true;
			
			while(powodzenie && x < wielkoscPortalu) {
				
				if(plansza[polozenie] == 0) {
					
					wspolrzedne[x++] = polozenie;
					polozenie += inkr;
					
					if(polozenie >= wielkoscPlanszy) {
						
						powodzenie = false;
					}
					
					if(x > 0 & (polozenie % dlugoscPlanszy == 0)) {
						powodzenie = false;
					}
				} else {
					
					powodzenie = false;
				}				
			}
		}
		
		int x = 0;
		int wiersz = 0;
		int kolumna = 0;
		
		while(x < wielkoscPortalu) {
			
			plansza[wspolrzedne[x]] = 1;
			wiersz = (int) (wspolrzedne[x] / dlugoscPlanszy);
			kolumna = wspolrzedne[x] % dlugoscPlanszy;
			pomoc = String.valueOf(alfabet.charAt(wiersz));
			x++;
		}
		return zajetePola;
	}
}

Z góry dziękuję za pomoc! :)

0

A ty programujesz lodówką czy mikrofalówką że ci nie pokazuje gdzie? o_O

public ArrayList rozmiescPortal(int wielkoscPortalu) {

Tutaj zwracasz z funkcji ArrayList bez podania typu elementów w kolekcji.

0

Programowanie lodówką w niczym nie przeszkadza. Wystarczy przeczytać i zrozumieć komunikat

Recompile with -Xlint:unchecked for details
a potem wpisać na konsoli: javac -Xlint:unchecked ...przeczytać i zrozumieć kolejny komunikat (będą w nim numery "podejrzanych" linii kodu).

0

Póki co uczę się pisząc w edytorze tekstowym i kompiluję w cmd. Dziękuję za podpowiedzi :) Dodam, że w Netbeansie kompilator nie wyświetla błędów.

0

Kompilator w cmd też nie wyświetla błędów, on wyświetla ostrzeżenie (warning).

0

Zainstaluj Intellij Community

0

Jeżeli w cmd to tylko ostrzeżenie to program powinien się uruchamiać czy się mylę?

0

Powinien, ale warning sugeruje że moze się potem wywalić w trakcie działania bo kompilator nie był w stanie zweryfikować czy nie robisz czegoś niedobrego.

0

Programować możesz nadal w notatniku (niektórzy nawet tak polecają się uczyć), ale zawsze stosuj maksymalne wsparcie kompilatora i czyść wszystkie errory i warningi.

Czyli:

-Xlint:all

Dłuższy opis: http://www.javaworld.com/article/2073587/javac-s--xlint-options.html

0

Mam kolejne pytanie: jak przerobić aplikację aby była "bardziej obiektowa" (takie dostałem zadanie)? Tzn. używać jak najmniej prymitywów, itd. Nie jestem zbyt doświadczony w tej kwestii, ale proszę powiedzieć co zrobić - nie chcę gotowca.

0

A kto Ci powiedział że prymitywy są złe? Zależy co robisz. W przetwarzaniu numerycznym są całkiem fajne: http://www.javaworld.com/article/2150208/java-language/a-case-for-keeping-primitives-in-java.html

Co do OOP:

  • unikaj klas typu "manager", "gra", "zarządca", "pomocnik" itd.
  • każda funkcja powinna robić tylko jedną rzecz, a nie wczytanie, skanowanie i wyświetlenie: https://pl.wikipedia.org/wiki/Zasada_jednej_odpowiedzialno%C5%9Bci
  • jeśli funkcja robi za dużo - wydziel z niej mniejsze
  • nie używaj "stringly typing", czyli zamień stringi na enumy, przykład:
if(wynik.equals("trafiony")) {

i

sprawdzRuchGracza(String ruch)

opis: http://wiki.c2.com/?StringlyTyped

  • zamiast:
ArrayList<String> zajetePola

zrób:

ListaPol zajetePola // nowa klasa enkapsulująca stan listy pól
  • po wczytaniu od razu zwracaj przeprocesowane dane a nie jakieś stringi:
    zamiast:
public String pobierzDaneWejsciowe(String komunikat)

zrób:

public ParametryWejsciowe pobierzDaneWejsciowe() // komunikat może być wyświetlony wcześniej

lub łatwiejsza wersja:

public Map<TypParametru, Object> pobierzDaneWejsciowe() // zwraca EnumMap, TypParametru to enum 
0

Panowie
Też przerabiam ta książke i mam ten sam problem:

Note: PortalGraMax.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

PortalGraMax.java:35: warning: [unchecked] unchecked conversion
ArrayList<string> nowePolozenie = pomocnik.rozmiescPortal(3);

required: ArrayList<string>
found: ArrayList
1 warning

wskazuje miejsce błedu tam gdzie argument 3
Pomoze ktos?

0

Szklana kula mówi ze metoda pomocnik.rozmiescPortal(3); zwraca ArrayList bez podania typu.

0
Shalom napisał(a):

Szklana kula mówi ze metoda pomocnik.rozmiescPortal(3); zwraca ArrayList bez podania typu.

Hm
Mam ten sam kod co kolega na poczatku w wątku. A jak podać ten typ? Czy kryształowa kula wie coś więcej ?:)

0
public ArrayList rozmiescPortal(int wielkoscPortalu) {
Tutaj zwracasz z funkcji ArrayList bez podania typu elementów w kolekcji.

No czytałem i nie wiem co mam zrobić.

0

No to nie pozostało ci chyba nic innego, tylko nauczyć się programować w javie. Innej rady nie ma. Skoro nie umiesz ukraść kodu z internetu to będziesz musiał go napisać samodzielnie.

0

Już mam :) dzieki za motywacje

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