1. ホーム
  2. java

リソースリーク:'sc'がクローズされない

2022-02-14 04:07:12

ショッピング管理システムを再度書き込むと、「'sc' is never closed, 'sc' is never closed」という警告が表示されました。

メソッドの末尾に sc.close() を追加すると、エラーが報告されます。

 到達不能なコード

具体的なプログラムはこのようになります。

<スパン

@Override
	public void addToCar() {
		showAllGood();//show all goods
		Scanner sc = new Scanner(System.in);
		System.out.println("Please enter the serial number of the product");
		int id = sc.nextInt();
		int num ;
		boolean flag = true;//while's loop condition, reassigned within the loop
		while(true) {
			System.out.println("Please enter the number of purchases ");
			num = sc.nextInt();
			if(goods.get(id).getCount()-num<0) //shopping out of stock
				System.out.println("Sorry, shopping is out of stock, please reduce the number of purchases! The quantity needs to be less than "+goods.get(id).getCount());
			else {
				flag = false;
				goods.get(id).setCount(goods.get(id).getCount()-num);
				Goods newgood = new Goods(goods.get(id).getName(),goods.get(id).getPrice(),num);
				p.addCar(newgood);
			}
		}
		//sc.close();
	}






アラートによると、scは決して閉じないということで、私のscはwhileループの中で値を取るので
そして、私のwhileループの条件をよく見てみると、while(true)-deadループであることがわかります。すべてのscオブジェクトは常に使用中であり、クローズすることはできません。
そして、while(true) を while(flag) に変更すると、警告は消え、 sc.close(); は正しく閉じます。

手順を修正しました。

@Override
	public void addToCar() {
		showAllGood();//show all goods
		Scanner sc = new Scanner(System.in);
		System.out.println("Please enter the serial number of the product");
		int id = sc.nextInt();
		int num ;
		boolean flag = true;//while's loop condition, reassigned within the loop
		while(true) {
			System.out.println("Please enter the number of purchases ");
			num = sc.nextInt();
			if(goods.get(id).getCount()-num<0) //shopping out of stock
				System.out.println("Sorry, shopping is out of stock, please reduce the number of purchases! The quantity needs to be less than "+goods.get(id).getCount());
			else {
				flag = false;
				goods.get(id).setCount(goods.get(id).getCount()-num);
				Goods newgood = new Goods(goods.get(id).getName(),goods.get(id).getPrice(),num);
				p.addCar(newgood);
			}
		}
		sc.close();
	}