Scanner

import java.util.Scanner;
public class Aula02 {
public static void main(String[] args) {
int opcao;
String localChange;
String addLocal;
Scanner scanner = new Scanner(System.in);
Partida p1 = new Partida();

	System.out.println("----- Partida -----");
	System.out.println("1---- Status ----");
	System.out.println("2---- Adicionar Local ----");
	System.out.println("3---- Trocar Local ----");
	System.out.println("4---- Adicionar Horário de Inicio");
	System.out.println("5---- Trocar Horário de Inicio");
	System.out.println("6---- Adicionar Horario Fim");
	System.out.println("7---- Trocar Horário de Fim");
	System.out.println("8---- Pausar ----");
	System.out.println("Escolha uma opcao: ");
	opcao = scanner.nextInt();
	switch(opcao){
		case 1:
			p1.status();
		break;
		case 2:
			System.out.println("Digite o local:");
			addLocal=scanner.nextLine();	
			p1.local = addLocal;
			p1.status();
		break;
		case 3:
			localChange=scanner.nextLine();
			p1.alterarLocal(localChange);
		break;
		default:
		System.out.println("Digite uma opcao válida");
	}
}

}

public class Partida{
String local;
String data;
String inicio;
String fim;
boolean iniciada;
boolean pausada;

public void status(){
	System.out.println("Local da Partida: "+ this.local);
	System.out.println("Data da Partida: "+ this.data);
	System.out.println("Horario de Inicio: "+ this.inicio);
	System.out.println("Horario do Término: "+ this.fim);
	System.out.println("Partida Iniciada?"+ this.iniciada);
	System.out.println("Partida Pausada?"+ this.pausada);
}

public void iniciar(){
	if(this.iniciada == true){
		System.out.println("Essa partida ja começou!");
	}else{
		this.iniciada = true;
	}
}

public void finalizar(){
	if(this.iniciada == true){
		System.out.println("Fim da partida");
	}else{
		System.out.println("Essa partida ainda não foi iniciada");
	}
}

}

Eu tenho esse programa que estou utilizando para aprender POO em Java, ok, a minha dúvida é em relação ao objeto Scanner, no case 2 eu queria ler do teclado e adicionar o local, até ai tudo bem, mas ele não funciona, simplesmente passa direto, não da erro nem nada, eu tento utilizar o mesmo objeto scanner para ler a string e ele ignora, pra funcionar eu tive que criar outro objeto Scanner dentro do case 2, alguém sabe me explicar o porquê disso acontecer?

Agradeço desde já!

Questões técnicas do Scanner.
Recomendo não criar uma var dele e sim sempre que precisar faz new Scanner(System.in).nextAlgumaCoisa()

Filipe, você pode criar dois buffer de entrada, um para ler todos os tipos de dados

e outro para ler somente String:

Scanner scannerString = new Scanner(System.in);

addLocal=scannerString.nextLine();

Quer saber mais sobre programação? Acesse o meu canal SiAbreu Tec

De acordo com a documentação, o Scanner quebra seu input em tokens usando como base um certo delimitador, este delimitador, por padrão, é um espaço em branco, mas vc pode escolher o delimitador que quiser.

Quando vc entra com o input “123 abc %#?”, o Scanner entende que ali há 3 tokens: “123”, “abc” e “%#?”. Lembre-se que ele define onde começa e termina um token com base no espaço em branco.

Se vc rodar o código abaixo usando como input o exemplo acima, ele irá imprimir apenas “>>>123<<<”.

public class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(">>>" + scan.next() + "<<<"); // >>>123<<<
    }
}

Na maioria das vezes não é esse o comportamento que desejamos. O que queremos é que ele imprima “123 abc %#?”. E para alcançarmos isso usamos o nextLine(). A diferença entre nextLine e os outros nexts é que o delimitador do nextLine é uma quebra de linha. Ou seja, cada linha é um token para o nextLine. Experimente com:

public class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(">>>" + scan.nextLine() + "<<<"); // >>>123 abc %#?<<<
    }
}

Agora experimente usar aquele input com isso:

public class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(">>>" + scan.next() + "<<<"); // >>>123<<<
        System.out.println(">>>" + scan.next() + "<<<"); // >>>abc<<<
        System.out.println(">>>" + scan.next() + "<<<"); // >>>%#?<<<
    }
}

Bom, sabemos que os métodos next quebra o input usando um espaço em branco. Pode ser qualquer espaço em branco, inclusive caracteres invisiveis que representam uma nova linha!

Quando vc digita “123” e pressiona Enter, ele te devolve o 123, mas mantém a nova linha inserida pelo Enter no buffer.

Sabemos também que o nextLine quebra o input em linha, não em espaços.

Se vc chama o next seguido por um nextLine usando como input o “123” e pressiona Enter pra rodar, o next devolve o “123” e mantém o “”“Enter”"" no buffer. Quando chega a vez do nextLine ele vê essa nova linha (esse “”“Enter”"") no buffer, tenta fazer seu trabalho, que é criar tokens com base em linhas, e retorna uma string vazia, pois é isso que há antes e depois do “”“Enter”"", uma string vazia.

Teste com:

public class Program {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println(">>>" + scan.next() + "<<<"); // >>>123<<<
        System.out.println(">>>" + scan.nextLine() + "<<<"); // >>><<<
    }
}

Para o seu caso, uma solução um pouco mais limpa do que criar 2 Scanner acho que seria invocar um nextLine() logo após o nextInt(). Ficaria assim:

/* ... */
opcao = scanner.nextInt();
scanner.nextLine();
/* ... */