Erro java.lang.NumberFormatException: For input string: ""

Boas colegas. Estou a tentar reforçar os meus conhecimentos em java então decide pegar um livro e estuda-lo… Num dos exercícios de fatorial ao executar o codigo dá o seguinte erro:
Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:662) at java.base/java.lang.Integer.parseInt(Integer.java:770) at cap5exercices.example1.Fatorial.main(Fatorial.java:19)

A linha na qual aponta para o erro é esta:
int n = Integer.valueOf(s).intValue(); //variavel ira converter a valor na posicao 0 da string s

O código inteiro é:

public static void main(String[] args) throws IOException {
	String s = ""; 
	int k; //variavel de controlo
	char c; //armazenara o numero do teclado
	long total = 1;
	
	//asking for a number
	System.out.println("Qual e o numero?");
	while ((c = (char) System.in.read()) != 10) { // onde 10 igual a enter considerar caracteres na posicao 0
		s += c;
		s = s.substring(0, s.length()-1); //elimina o lixo no final da string
		
		int n = Integer.valueOf(s).intValue(); //variavel ira converter a valor na posicao 0 da string s
		
		for (k = n; k>=1; k--) { //achar o fatorial
			total *= k; //total ira multiplicar com os valores que a variavel de controlo ira obtendo
			System.out.println(n + "! = " + total); //exibicao do resultado na console
		}
		
		
		
	}
	

}

Revisei o código e não vi diferença alguma, e no livro não aborda sobre o erro…

o S nao esta recebendo nenhum valor

Você está concatenando a String s com o char c. Como s = " ", então:

" " + c.

Você está concatenando a String s com o char c. Como s = " " , então:

" " + c .

Entendi… Como poderei solucionar, visto que estou a seguir o exemplo do livro?

Supostamente receberia o valor do teclado

Na verdade, agora que eu reparei que é String s = "" e não String s = " ". Enquanto a primeira representa uma string vazia, a segunda representa um espaço. Logo:

s += c -> c.

Dá para fazer assim:

public class Teste {
	public static void main(String[] args) throws java.io.IOException{
		char leitura;
		int controle;
		int numero;
		long total = 1;
		String string = "";
		    		
		System.out.print("Qual é o número?\nValor informado: ");
	
		while((leitura = (char) System.in.read()) != 10){
			if(Character.isDigit(leitura)){
				string += leitura;
				
				string = string.substring(0, string.length());
			
				numero = Integer.valueOf(string).intValue();
				
				for(controle = numero; controle >= 1; controle--){
					total *= controle;
				}
				
				System.out.println(numero + "! = " + total);
			}
		}
	}
}

Rodando…

image

O código só não faz muito sentido…

Obrigado! Com base no seu código consegui superar o erro. As alterações:
Retirei -1 da linha s = s.substring(0, s.length()-1); e;
Retirei a linha dentro da estrutura for responsável por enviar para a tela o resultado, para fora da estrutura
System.out.println(n + "! = " + total);