Métodos em uma classe Java

Minha questão pede criar uma classe que recebe um nome gerado pelo usuário no terminal e seja capaz utilizar métodos capazes de manipular o nome informado e realizar operações sobre ele.
A primeira é para retornar o primeiro caractere de todos os nomes informados em letra maiuscula.
O segundo é para retornar o primeiro nome e o ultimo sobrenome do usuário por exemplo: josé luis silva. Saída = josé SIlva
Terceiro, um método que retorne só as iniciais do nome.
Quarto, um método tudoMinusculo, que coloque todos os caracteres da string e
m minúsculo (caixa baixa).
Quinto, um método que retorne o tamanho, em número de caracteres, da string a
rmazenada.
Sexto, um método que conte o número de ocorrências de um determinado caracter recebido como parâmetro.

Comecei a fazer o código e pesquisar, tudo bem. Só que depois de pronto só funcionam os dois primeiros métodos. Não acusa o erro no eclipse, mas se seleciono qualquer opção fora a 1 e a 2 o código da erro e não executa o comando.

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {
		
		Scanner input = new Scanner(System.in);
		
		System.out.println("Informe um nome: ");
		String nome = input.nextLine();
		
		System.out.println("Opcoes: \n"
						 + "1 - Primeira Maiuscula\n"
						 + "2 - Primeiro e último nome\n"
						 + "3 - Iniciais\n"
						 + "4 - Passar as letras para minusculo\n"
						 + "5 - Numero de caracteres\n"
						 + "6 - Ocorrencia de uma determinada letra\n");
		int opcao = input.nextInt();
		
		switch (opcao) {
		case 1:
		String Maiuscula = iniMaiuscula(nome); 
			System.out.println(iniMaiuscula(nome));
			break;
			
		case 2: 
			String primeiroUltimo = primeiroEultimo(nome); 
			System.out.println(primeiroEultimo(nome));
		    
			break;
		case 3:
			String Inicial = iniciais(nome);
			System.out.println("Iniciais: " +iniciais(nome));
			
			break;
			
		case 4: 
			String Minuscula = minuscula(nome);
			System.out.println(minuscula(nome));
			
			break;
		
		case 5: 
			String numCaracteres = caracteres(nome);
    System.out.println(caracteres(nome));

    break;
			
			
		case 6:
			String ocorrenciaCar = ocorrencia(nome);
			System.out.println(ocorrencia(nome));

    break;
		default:
			break;
		}
		
	}
  	//Questão a
	public static String iniMaiuscula(String value) {
		String result = "";
		String[] nomes = value.split(" ");
		for(String palavra : nomes){
			result = result + " " + palavra.replaceFirst(palavra.substring(0, 1), palavra.substring(0, 1).toUpperCase());
		}
		return result.trim();
	}
	//questão b
public static String primeiroEultimo(String value){
  String[] prenomes = value.split(" ");
  return prenomes[0] + " " + prenomes [prenomes.length -1];
}

	//Questão c
	public static String iniciais(String value) {
	    String primeiraLetraNomeSobrenome = "";
	    String nome = null;
		for (char letra : nome.toCharArray()) {
	        if (Character.isUpperCase(letra)) {
	            primeiraLetraNomeSobrenome += letra;
	        }
	    }
		return nome;
		}
	//Questão d
	public static String minuscula(String value){
	      String palavra = null;
	      palavra.toLowerCase(); 
	      System.out.println(palavra.toLowerCase());
		return palavra; 
	   
	}
	
	//Questão e
	public static String caracteres (String value) {
        String str = null;
		String frs = str;
        int vog = 0, cons = 0;
        str= str.toLowerCase();
        for(int i = 0; i < str.length(); i++){
            char c = str.charAt(i);
            if(c == 32) continue;
            if(c == 97 | c == 101 | c == 105 | c == 111 | c == 117){
                vog++;
                continue;
            }
            if(c >= 98 && c <= 122) cons++;
        }
        System.out.println("Na frase \""+frs+"\" temos:\nVogais: "+vog+"\nConsoantes: "+cons);
		return frs;
        
    }
	
	//questão f
	public static String ocorrencia (String value) {
		int total=0;
		String x = null;
		for (int i=0;i<=x.length()-1;i++) {
			if (x.substring(i,i+1).equalsIgnoreCase("o"))
				total=total+1;
		}
		System.out.println(total);
		return x;
	}

}

Alguém pode me dizer o que está errado? Sei que deve ter bastante coisa, mas ainda sou muito leigo em Java.

Por que você não quebra a String em vários nomes e pega só o primeiro de cada?

String[] nomes = value.split(" ");
for(String nome : nomes) {
    primeiraLetraNomeSobrenome += nome.charAt(0);
}

Outro ponto, no teu método você retorna nome, embora você sequer coloque qualquer valor nele no código.

O toLowerCase, assim como vários método da String retornam a String em minúsculo, você precisa pegar o retorno deste método para surtir efeito na String em questão. Isso ocorre por que a String é imutável.

palavra = palavra.toLowerCase();

Você inverteu os itens quinto e sexto e nenhum deles está legal.
Para retornar o tamanho de uma String, basta invocar o método length

"ABCDE".length(); //retornará 5

Já a ocorrência de caracteres em uma String, você pode, simplesmente, quebrar com split e contar o tamanho do array, removendo 1:

String x = "sfdfgdgdfhfghghghjgh";
String[] y = x.split("d");
System.out.println(y.length - 1); //retorna 3

se charAt retorna um char que, essencialmente, é um inteiro de 8 bits, eu nao vejo como isso vai dar certo. eu pensaria em fazer um nome.substring(0,1)

mas posso estar falando bobagem

Roda sim. Basicamente, isso é o mesmo que

primeiraLetraNomeSobrenome = primeiraLetraNomeSobrenome + 1;

Ou

primeiraLetraNomeSobrenome = primeiraLetraNomeSobrenome + 'a';

Tentei fazer assim mas acusou esse erro: exit status 1
Main.java:80: error: cannot find symbol
primeiraLetraNomeSobrenome += nome.charAt(0);
^
symbol: variable primeiraLetraNomeSobrenome
location: class Main
1 error

Não entendo muito bem.

Isso significa que você não declarou a variável em questão.
O que eu coloquei são trechos a serem utilizados.

nesse caso a quinta ficaria assim ou tem que acrescentar mais alguma coisa?
public static String caracteres (String value) {
String[] caractere = value.length();

Ah sim, vou continuar vendo lá;

Consegui arrumar! Agora a opção três executa direitinho.

Não precisa complicar.
Você tem que devolver o tamanho, em número de caracteres. Ou seja, quantos caracteres aquela String possui. Logo, entendo eu, retorna isso

 return value.length();

Eu fiz assim, para pegar o nome que já é inserido no programa para verificar:
public static String ocorrencia (String value) {
String x = " ";
String[] y = value.split(“d”);
System.out.println(y.length - 1);
return x;

Só que aí quando executo , digamos que tenham duas letras “d” no nome, retorna: 2 dois, um em cima do outro, ao invés de só um 2. Porque?

E se eu quiser colocar pro usuário inserir a letra, como faço?

Cara, esse foi só um exemplo do uso do método split.

Eu sei, mas tentei usar para deixar o método menor. Vou tentar outra coisa.

Olha, a sugestão que dei é uma opção e você pode escolher qual achar melhor, mas, esta funciona.

Resolvi usar aquela mesma, mas to com um problema naquela para contar caractere. Tentei fazer como você disse mas não consegui assimilar. Tentei isso:

public static String caracteres (String value) {
String caractere = " ";
caractere = value.length();
return caractere;
}

mas dá esse erro:
exit status 1
Main.java:98: error: incompatible types: int cannot be converted to String
caractere = value.length();
^
1 error

Não sei como arrumar. É a última que falta

Está falando de qual das questões? Pois você misturou tudo aí.

A de contar as strings. Tentei fazer como falei acima, mas dá esse erro. Foi mal, é o cansaço.

Cansaço não é desculpa.
Se está falando dessa

Não tem que inventar

public static int tamanho(String armazenada) {
    return armazenada.length();
}

Se está falando dessa

Aí a coisa muda um pouco

Essa já fiz, era a outra mesmo, de contar os caracteres. Tava trocado. Vou ver se ajeito com o que você disse. Sempre da erro no case. int cannot be converted to String.

Você está esperando uma String, não um int. Mas a contagem de caracteres retorna um int