Problemas com esse programa

Pessoal, eu preciso desenvolver um projeto, que gere uma fatura de conta telefônica. O enunciado do projeto, é esse:

[quote]Faça um programa para calcular o valor da conta telefônica da empresa em que você trabalha. A conta é composta por ligações locais e ligações interurbanas.

Para a ligação local são registrados o dia da semana e o horário em que foi iniciada a ligação, bem como o dia da semana e o horário em que foi finalizada. O preço cobrado por uma ligação local depende da quantidade de pulsos que, neste caso, é tomada como a quantidade de minutos gasta com a ligação, exceto quando o dia da semana for domingo ou sábado após as 14:00 horas, quando então só é contabilizado um pulso independente do tempo de ligação. O preço de uma ligação local é computado em função do produto entre a quantidade de pulsos e o valor cobrado pelo pulso.

Já para uma ligação interurbana é registrado o número do telefone de destino (para ser impresso na fatura), o dia da semana e horário em que a ligação foi iniciada, e o dia da semana e o horário em que foi encerrada. O preço de uma ligação interurbana é calculado em função da quantidade de minutos que consumiu e pelo preço cobrado por minuto.

O plano de telefonia que a empresa que você trabalha contratou segue as seguintes regras:
 De segunda à sexta, em horário comercial (08:00h às 11:59h e 13:00h às 17:59h), o preço cobrado por minuto é acrescido de 10%;
 De segunda à sexta no horário das 21:00 as 23:59, o preço do minuto é reduzido em 25%
 Aos sábados após as 14:00 horas, o preço do minuto é reduzido em 25%.
 Aos domingos das 06:00 as 23:59, o preço é reduzido em 25%.
 Em qualquer dia da semana, das 00:00 h até as 5:59h, o preço do minuto é reduzido em 50%.

O seu programa deve conter classes para manipular informações a respeito de cada tipo de ligação. Além dessas, deve ser implementada uma classe Fatura, que deve conter as informações sobre as ligações efetuadas, onde deve ser implementado:
 Um método para cadastrar as ligações.
 Um método que imprima na tela a fatura a ser paga pela companhia

Observação

Nas classes referentes às ligações deve se ter o cuidado de contabilizar corretamente o preço das ligações que iniciam em um determinado horário e que perduram, passando a ter diferentes valores de pulso (ligações locais), ou diferentes valores de minuto (ligações interurbanas).

Exemplo: ligação local iniciada no sábado as 13:00 e encerrada as 14:30, deve ser contabilizado como 61 pulsos, e não 90.

Para os cálculos de valor da fatura, você deve criar duas constantes que fornecem o preço em reais do pulso das ligações locais e do minuto das ligações interurbanas.
[/quote]

Eu já desenvolvi todas as classes necessário e mais uma classe para fazer os testes com as classes do programa em si, porém está ocorrendo um erro que eu não sei porque ocorre.

Vou postar todo o código para vocês analisarem. Só adiantando, o erro que aparece, é esse aqui:

[quote]java.lang.NullPointerException
at fatura.<init>(Main.java:313)
at Main.main(Main.java:459)
Exception in thread “main” [/quote]

[code]import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

class ligacao
{
byte hora_i, hora_f, minuto_i, minuto_f;
byte dia_i, dia_f;

String telefone;
String dia_final,dia_inicial,hora_inicial,hora_final;
double valor;
boolean ocupado = false;

public int tempo_total()
{
	int m_i,m_f;
	int operando,tempo_dia,total=0;
	
	tempo_dia = this.dia_f - this.dia_i;
	tempo_dia = tempo_dia*24;
	tempo_dia = tempo_dia*60;
	
	m_i = this.hora_i*60;
	m_i = m_i+this.minuto_i;
	
	m_f = this.hora_f*60;
	m_f= m_f + this.minuto_f;
	
	
	if (m_f > m_i)
	{
		operando = m_f-m_i;
		total = tempo_dia+operando;
	}	
	if (m_f < m_i)
	{
		operando = m_i-m_f;
		total = tempo_dia-operando;
	}
	if (m_f == m_i)
	{
		total = tempo_dia;
	}
	return total;
}

}

class ligacao_local extends ligacao
{
private double preco_local = 0.05; //Preco por pulso.
private int pulso = 3; //1 pulso equivale a 3 minutos.
private int pulsos; //Armezena o total de pulsos da ligação…
private int tempo_total;

public ligacao_local(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
{
	
	this.dia_f = dia_final;
	this.dia_i = dia_inicial;
	this.hora_f = hora_final;
	this.hora_i = hora_inicial;
	this.minuto_f = minuto_final;
	this.minuto_i = minuto_inicial;
	
	this.tempo_total = this.tempo_total();
}

public double preco_local()
{
	double valor;
	
	this.pulsos = this.tempo_total / this.pulso;
	
	switch (this.dia_i)
	{
		case 1: //Segunda-feira
		{
			valor = this.pulsos*this.preco_local;
			return valor;
		}
		case 2: //Terça-feira
		{
			valor = pulsos*this.preco_local;
			return valor;
		}
		case 3: //Quarta-feira
		{
			valor = pulsos*this.preco_local;
			return valor;
		}
		case 4: //Quinta-feira
		{
			valor = pulsos*this.preco_local;
			return valor;
		}
		case 5: //Sexta-feira
		{
			valor = pulsos*this.preco_local;
			return valor;
		}
		case 6: //Sábado
		{
			if (this.hora_i >= 14)
			{
				return this.preco_local;
			}
			else
			{
				valor = pulsos*this.preco_local;
				return valor;
			}
		}
		case 7: //Domingo
		{
			return this.preco_local;
		}				
	}
	return -1;
}

}

class ligacao_inter extends ligacao
{
private int tempo_total; //Tempo total de uma ligação interurbana
private double preco_minuto = 0.45; //Na ligacao interurbana, é cobrado um valor por minuto.
private int total_ligacoes; //Contabiliza o total de ligações feitas.

public ligacao_inter(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
{
	this.dia_f = dia_final;
	this.dia_i = dia_inicial;
	this.hora_f = hora_final;
	this.hora_i = hora_inicial;
	this.minuto_f = minuto_final;
	this.minuto_i = minuto_inicial;
	
	this.tempo_total = this.tempo_total();
}

public double preco()
{
	double valor;
	
	switch (this.dia_i)
	{
		case 1: //Segunda-feira
		{
			if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
			{
				valor = (this.tempo_total*this.preco_minuto)*1.1;
				return valor;
			}
			if ((this.hora_i >= 21) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if (this.hora_i == 12)
			{
				valor = (this.tempo_total*this.preco_minuto);
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		case 2: //Terça-feira
		{
			if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
			{
				valor = (this.tempo_total*this.preco_minuto)*1.1;
				return valor;
			}
			if ((this.hora_i >= 21) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if (this.hora_i == 12)
			{
				valor = (this.tempo_total*this.preco_minuto);
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		case 3: //Quarta-feira
		{
			if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
			{
				valor = (this.tempo_total*this.preco_minuto)*1.1;
				return valor;
			}
			if ((this.hora_i >= 21) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if (this.hora_i == 12)
			{
				valor = (this.tempo_total*this.preco_minuto);
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		case 4: //Quinta-feira
		{
			if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
			{
				valor = (this.tempo_total*this.preco_minuto)*1.1;
				return valor;
			}
			if ((this.hora_i >= 21) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if (this.hora_i == 12)
			{
				valor = (this.tempo_total*this.preco_minuto);
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		case 5: //Sexta-feira
		{
			if (((this.hora_i >= 8) && (this.hora_i < 12)) || ((this.hora_i >= 13) && (this.hora_i < 18)))
			{
				valor = (this.tempo_total*this.preco_minuto)*1.1;
				return valor;
			}
			if ((this.hora_i >= 21) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if (this.hora_i == 12)
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		case 6: //Sabado
		{
			if (this.hora_i >= 14)
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			if ((this.hora_i >= 0) && (this.hora_i < 6))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto);
				return valor;
			}
		}
		case 7: //Domingo
		{
			if ((this.hora_i >= 6) && (this.hora_i < 24))
			{
				valor = (this.tempo_total*this.preco_minuto)*0.75;
				return valor;
			}
			else
			{
				valor = (this.tempo_total*this.preco_minuto)*0.5;
				return valor;
			}
		}
		default:
		{
			return -1;
		}
	}
}

}

class fatura
{
int qts_ligacoes = 500;
ligacao ligacoes[];

public fatura()
{
	this.ligacoes = new ligacao[qts_ligacoes];
	int i;
	
	for (i=0;i<qts_ligacoes;i++)
	{
		this.ligacoes[i].ocupado = false;
	}
}

public void liga_local(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final)
{
	double preco;
	String hora_i, hora_f, dia_f, dia_i,tel;
	
	int posicao = this.OndeGuardar();
	
	ligacao_local x = new ligacao_local(hora_inicial,minuto_inicial,hora_final,minuto_final,dia_inicial,dia_final);
	
	preco = x.preco_local();
	hora_i = this.toStringH(hora_inicial,minuto_inicial);
	hora_f = this.toStringH(hora_final,minuto_final);
	dia_i = this.ObtemDia(dia_inicial);
	dia_f = this.ObtemDia(dia_final);
	tel = "LIGAÇÃO LOCAL";
	
	this.ligacoes[posicao].dia_final = dia_f;
	this.ligacoes[posicao].dia_inicial = dia_i;
	this.ligacoes[posicao].hora_inicial = hora_i;
	this.ligacoes[posicao].hora_final = hora_f;
	this.ligacoes[posicao].telefone = tel;
	this.ligacoes[posicao].valor = preco;
	this.ligacoes[posicao].ocupado = true;
	
}

public void liga_inter(byte hora_inicial,byte minuto_inicial,byte hora_final, byte minuto_final, byte dia_inicial, byte dia_final, String tel)
{
	double preco;
	String hora_i, hora_f, dia_f, dia_i;
	
	int posicao = this.OndeGuardar();
	
	ligacao_inter x = new ligacao_inter(hora_inicial,minuto_inicial,hora_final,minuto_final,dia_inicial,dia_final);
	
	preco = x.preco();
	hora_i = this.toStringH(hora_inicial,minuto_inicial);
	hora_f = this.toStringH(hora_final,minuto_final);
	dia_i = this.ObtemDia(dia_inicial);
	dia_f = this.ObtemDia(dia_final);
	
	this.ligacoes[posicao].telefone = tel;
	this.ligacoes[posicao].dia_final = dia_f;
	this.ligacoes[posicao].dia_inicial = dia_i;
	this.ligacoes[posicao].hora_final = hora_f;
	this.ligacoes[posicao].hora_inicial = hora_i;
	this.ligacoes[posicao].ocupado = true;
	this.ligacoes[posicao].valor = preco;
	this.ligacoes[posicao].ocupado = true;
	
}

	public String ObtemDia(int dia)
	{
		switch (dia)
		{
			case 1: //Segunda-feira
			{
				return "Segunda-feira";
			}
			case 2: //Terça-feira
			{
				return "Terça-feira";
			}
			case 3: //Quarta-feira
			{
				return "Quarta-feira";
			}
			case 4: //Quinta-feira
			{
				return "Quinta-feira";
			}
			case 5: //Sexta-feira
			{
				return "Sexta-feira";
			}
			case 6: //Sábado
			{
				return "Sábado";
			}
			case 7: //Domingo
			{
				return "Domingo";
			}
			default:
			{
				return "ERRO";
			}
		}
	}

	public String toStringH(int hora, int minuto)
	{
		String s;
		s = new String(hora+":"+minuto);
		return s;
	}

	private int OndeGuardar()
	{
		int i=0;

		while (this.ligacoes[i].ocupado == true)
		{
			i++;
		}
		return i;
	}

	public void exibe_conta()
	{
		int i = 0;
		double total=0;
	
		System.out.println("         FATURA        ");
		System.out.println("-----------------------");
	
		System.out.println("  HORÁRIOS    -     DIAS DA SEMANA       -   TELEFONE   -   VALOR");
	
		while (this.ligacoes[i].ocupado == true)
		{
			System.out.print(this.ligacoes[i].hora_inicial + " - ");
			System.out.print(this.ligacoes[i].hora_final + " - ");
			System.out.print(this.ligacoes[i].dia_inicial + " - ");
			System.out.print(this.ligacoes[i].dia_final + " - ");
			System.out.print(this.ligacoes[i].telefone + " - ");
			System.out.println("R$"+this.ligacoes[i].valor);
			total=total+this.ligacoes[i].valor;
			i++;
		}
		System.out.print("Total a ser pago: ");
		System.out.println("R$"+total);
	}
}

public class Main 
{
	public static void main(String Args[]) throws IOException
	{
		char opc;
		String s;
	
		fatura conta = new fatura();
	
		BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
	
		System.out.println("PROJETO DE JAVA");
		System.out.println("----------------");
		System.out.println();
		System.out.println("Autor: Ricardo Augusto Giaviti 04076865");
		System.out.println("Autor: Marcos Akira Sekiya 04076865");
		System.out.println();
		System.out.println("CONTA TELEFÔNICA");
		System.out.println("----------------");
	
		do
		{
			System.out.println("Qual sua opção?");
			System.out.println("1 - Ligação local");
			System.out.println("2 - Ligação interurbana");
			System.out.println("3 - Exibir fatura");
			System.out.println("S - Sair");
		
			s = entrada.readLine();
			opc = s.charAt(0);
		
			switch (opc)
			{
				case '1':
				{
					Main.local(conta);
					break;
				}
				case '2':
				{
					Main.inter(conta);
					break;
				}
				case '3':
				{
					Main.fatura(conta);
					break;
				}
			}
		}
		while ((opc != 's') || (opc != 'S'));
	
	}

	public static void local(fatura conta) throws IOException
	{
		BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
	
		String s;
		byte horas_i,horas_f,minutos_i,minutos_f,dia,dia_f;
		boolean erro;
	
		System.out.println("LIGAÇÃO LOCAL");
		System.out.println("-------------");
	
		System.out.print("Hora de início: ");
		s = entrada.readLine();
	
		horas_i = Byte.parseByte(s); //Conversão para INT
	
		System.out.print("Minuto de início: ");
		s = entrada.readLine();
	
		minutos_i = Byte.parseByte(s);
	
		System.out.print("Hora final: ");
		s = entrada.readLine();
	
		horas_f = Byte.parseByte(s); //Conversão para INT
		System.out.print("Minuto final: ");
		s = entrada.readLine();
	
		minutos_f = Byte.parseByte(s);
	
		System.out.println("Escolha o dia");
		System.out.println("1 - Segunda-feira");
		System.out.println("2 - Terça-feira");
		System.out.println("3 - Quarta-feira");
		System.out.println("4 - Quinta-feira");
		System.out.println("5 - Sexta-feira");
		System.out.println("6 - Sábado");
		System.out.println("7 - Domingo");
	
		System.out.print("DIA: ");
		s = entrada.readLine();
	
		dia = Byte.parseByte(s);
	
		System.out.println("Escolha o dia de término da ligação");
		System.out.println("1 - Segunda-feira");
		System.out.println("2 - Terça-feira");
		System.out.println("3 - Quarta-feira");
		System.out.println("4 - Quinta-feira");
		System.out.println("5 - Sexta-feira");
		System.out.println("6 - Sábado");
		System.out.println("7 - Domingo");
	
		System.out.print("DIA: ");
		s = entrada.readLine();
	
		dia_f = Byte.parseByte(s);
	
		conta.liga_local(horas_i,minutos_i,horas_f,minutos_f,dia,dia_f);
	
		System.out.println("Cadastrado com sucesso.");
		
	}

	public static void inter(fatura conta) throws IOException
	{
		BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
	
		boolean erro;
		String s,tel;
		byte horas_i,horas_f,minutos_i,minutos_f,dia,dia_f;
	
		System.out.println("LIGAÇÃO INTERURBANA");
		System.out.println("-------------");
	
		System.out.print("Telefone de destino: ");
		tel = entrada.readLine();
	
		System.out.print("Hora de início: ");
		s = entrada.readLine();
	
		horas_i = Byte.parseByte(s); //Conversão para INT
	
		System.out.print("Minuto de início: ");
		s = entrada.readLine();
	
		minutos_i = Byte.parseByte(s);
	
		System.out.print("Hora final: ");
		s = entrada.readLine();
	
		horas_f = Byte.parseByte(s); //Conversão para INT
		System.out.print("Minuto final: ");
		s = entrada.readLine();
	
		minutos_f = Byte.parseByte(s);
	
		System.out.println("Escolha o dia de início da ligação");
		System.out.println("1 - Segunda-feira");
		System.out.println("2 - Terça-feira");
		System.out.println("3 - Quarta-feira");
		System.out.println("4 - Quinta-feira");
		System.out.println("5 - Sexta-feira");
		System.out.println("6 - Sábado");
		System.out.println("7 - Domingo");
	
		System.out.print("DIA: ");
		s = entrada.readLine();
	
		dia = Byte.parseByte(s);
	
		System.out.println("Escolha o dia de término da ligação");
		System.out.println("1 - Segunda-feira");
		System.out.println("2 - Terça-feira");
		System.out.println("3 - Quarta-feira");
		System.out.println("4 - Quinta-feira");
		System.out.println("5 - Sexta-feira");
		System.out.println("6 - Sábado");
		System.out.println("7 - Domingo");
	
		System.out.print("DIA: ");
		s = entrada.readLine();
	
		dia_f = Byte.parseByte(s);
	
		conta.liga_inter(horas_i,minutos_i,horas_f,minutos_f,dia,dia_f,tel);
	
			System.out.println("Cadastrado com sucesso.");
		
	}

	public static void fatura(fatura conta)
	{
		conta.exibe_conta();
	}
}[/code]

Kra, destaca a linha 313 do main por favor.

Fica complicado de achar no meio de tanta coisa,hehe.

Eh lah q está o erro e eu estava com um desse mesmo agora pouco, talvez eu consiga te ajudar

[code]class fatura
{
int qts_ligacoes = 500;
ligacao ligacoes[];

public fatura()
{
	this.ligacoes = new ligacao[qts_ligacoes];
	int i;
	
	for (i=0;i<qts_ligacoes;i++)
	{
		this.ligacoes[i].ocupado = false; <--LINHA 313
	}
}


[/code]

Ta destacado, esse construtor, é para atribuir false em todas as posições do vetor ligacoes.

cara, voce nao precisa usar esse loop…diferentemente de c/c++ java ja coloca um valor default para variaveis nao inicializadas:

o erro talvez seja porque nessa classe ligacao o atributo ocupado deve ser private ou protected…tente usar o modificador public, ou usar um metodo set.

ps.: noa vi se tem a classe ligacao no codigo que voce mandou ,mas da uma olhada nisso.

flw

Olá ,

cara seu erro eh o seguinte: na classe “ligacao” vc deve colocar como publico e statico a variavel boolean ocupado

>> public static boolean ocupado = false; <<

ok

tenta ae que vai rodar show…

farô