Erro de substring

Peguei um código na internet falando sobre pesquisa em uma tabela.
Mas só que quando eu compilo ele me dá um erro no método substring.
Alguém pode me ajudar?

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.lang.String;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;


/**
 * Esta classe herda de JFrame e contém uma tabela editável. Esta tabela
 * é criada com dados na memória, mas que poderiam ser obtidos de outra 
 * forma.
 * A tabela está na forma mais simples possível, não permitindo a inserção
 * de novas linhas. Para isso, devemos considerar o uso de uma instância de 
 * TableModel.
 * Dica 1: Os dados das células devem ser instâncias de classes, declaradas 
 *         como arrays de arrays de Objects. Para usar tipos nativos, devemos
 *         usar as classes-envelope (exemplo: Integer para int, Double para
 *         double, etc.)
 * Dica 2: Se sabemos o tamanho do array, isto é, quantas colunas e quantas
 *         linhas ou registros, podemos começar com um array de array de
 *         Objects vazio e preenchê-lo aos poucos com os dados, usando o
 *         método setValueAt da classe JTable. Este método recebe como 
 *         argumentos o objeto que usaremos como entrada, a linha e a coluna
 *         que queremos modificar.
 */
public class ExemploTable extends JFrame implements ActionListener
  {
  // Títulos das colunas.
  private Object[] títulosDasCélulas = {"Nome","Profissão","Cidade","Idade"};
  // Cinco linhas para a tabela.
  private Object[][] dadosDasCélulas = 
    {
      {"J.S.Bell","Físico","Santa Fé",new Integer(56)},  
      {"Sid Sackson","Filósofo","New York",new Integer(72)},  
      {"Scott Adams","Desenhista","Los Angeles",new Integer(48)},  
      {"Dave Barry","Humorista","Miami",new Integer(53)},  
      {"David Brackeen","Programador","Los Angeles",new Integer(36)},  
    };
  // A instância da classe que mostrará estes dados como uma tabela.
  private JTable tabela;
  // Um botão para mostrar como acesso aos dados é feito.
  private JButton exportaTabela;

  private JTextField texto;
  
  // O construtor, que monta a interface com o usuário.
  public ExemploTable()
    {
    // O título da janela.
    super("Exemplo de JTable");
    // Criamos a tabela com os dados e títulos de células existentes.    
    tabela = new JTable(dadosDasCélulas,títulosDasCélulas);
    // Adicionamos a tabela ao painel de conteúdo da interface gráfica.
    getContentPane().add(new JScrollPane(tabela),BorderLayout.CENTER); 
    // Ajustamos o tamanho da tabela.
    tabela.setPreferredScrollableViewportSize(new Dimension(500, 100));
    // Criamos um botão e o registramos como respondendo a eventos.
    exportaTabela = new JButton("Exporta tabela");
    exportaTabela.addActionListener(this);
    // Adicionamos o botão ao painel de conteúdo da interface gráfica.
    getContentPane().add(exportaTabela,BorderLayout.SOUTH);

    texto = new JTextField("");
    getContentPane().add(texto,BorderLayout.NORTH);

	
    // Declaramos que a aplicação terminará ao fecharmos a janela, definimos
    // o tamanho da janela automaticamente e mostramos a janela da interface
    // gráfica no computador.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
    }

  // Este método será chamado quando houver um evento de ação, ou seja, quando
  // o botão for pressionado.
  public void actionPerformed(ActionEvent e) 
    {
    // Este if é redundante, mas vamos deixá-lo assim mesmo...
    if (e.getSource() == exportaTabela)
      {
      // Para cada linha na tabela...
      for(int linha=0;linha<tabela.getRowCount();linha++)
        {
        // ..e para cada coluna...
        for(int coluna=0;coluna<tabela.getColumnCount();coluna++)
          {
          // Imprimimos os valores das células.
          System.out.print(tabela.getValueAt(linha,coluna)+";");
          }
        System.out.println();
        }
      }
    }

private void textoKeyReleased(java.awt.event.KeyEvent evt) { 
procuraTable(texto.getText()); 
}

private void procuraTable(String nome){ 
int tamanho = nome.length(); 
for (int linha = 0; linha><tabela.getRowCount(); linha++){ 
String nomeTabela = (String)tabela.getValueAt(linha, 1); 
if (tabela.substring(0,tamanho).equals(nome)){ 
tabela.setRowSelectionInterval(linha,linha); 
} 
} 
} 



  
  // O ponto de entrada da aplicação, simplesmente cria uma instância da 
  // classe.
  public static void main(String[] args) 
    {
    new ExemploTable();
    }

  }

>

Qual erro dá? OutOfBoundsException?

dica: Quando vc for postar codigo, coloque-o entre as tags [ code]seu código[ /code], assim ele fica endentado.

String nomeTabela = (String)tabela.getValueAt(linha, 1); 
 if (tabela.substring(0,tamanho).equals(nome)){ 

Acho que você não traduziu o código direito.
Você confundiu a “tabela” com o “nomeTabela”.
O código acima provavelmente seria:

String nomeTabela = (String)tabela.getValueAt(linha, 1); 
 if (nomeTabela.substring(0,tamanho).equals(nome)){