Posto il codice un po' più completo:

codice:
Vector<String> linee = new Vector<String>();
		linee.add("<!DOCTYPE bla bla><?php echo ciao; ?> <h1>jhvjv</h1> ");
		linee.add("<div id=\"maincontainer\" style=\"ciao\">questo è");
		linee.add(" <%=ciao%> il main <img src=\"ciao.jpg\" /> container</div>");
		linee.add("<a href=\"ciao.htm\">questo e' un link</a>");
		String linea2, nome_tag;
					   
		for(String linea:linee){
			
			while(!linea.equals("")){
				char c = linea.charAt(linea.indexOf("<")+1);
				if (c == '?') linea = linea.substring(linea.indexOf("?>")+2);// se ci sono tag PHP li elimina - +2 perké indexOf calcola l'indice del primo carattere della stringa nell'arg
				else if (c == '%') linea = linea.substring(linea.indexOf("%>")+2);// se ci sono tag ASP li elimina
				else if (c == '!') linea = linea.substring(linea.indexOf(">")+1);// se ci sono tag di commento li elimina
				else {
						 System.out.println(linea+"\n"+linea.indexOf("<")+1+"\n");
						if(linea.indexOf("<")+1 == -1) System.out.println("<");
						else if(linea.indexOf(">") == -1) System.out.println(">"); 
						linea2 = linea.substring(linea.indexOf("<")+1,linea.indexOf(">"));
						try{
							Tag t = new Tag(linea2);
							 //prima di inserirlo nello stack controllare se è di apertura o chiusura così da vedere se metterlo o toglierlo
							if(t.getOpen() != 2){
								tags.add(t); // simula il tagStack
							}
						}catch(MalformedTagException e){
							System.out.println(e);
						}
						linea = linea.substring(linea.indexOf(">")+1); // elimino il testo già esaminato perché indexOf restituisce solo il primo carattere che trova, non tutti.
					
				}
			}
		}
Le parti in arancione sono dei debug manuali, che restituiscono:

codice:
 <h1>jhvjv</h1> 
11

jhvjv</h1> 
51

 
-11
Proprio non capisco... perké nella prima riga... lui va a prendersi il secondo < e non il primo?!